/**
 * 链表和数组哪个实现队列更快
 * 数组慢 链表快   因为数组的shift的速度很慢   队列的特点是先进先出  用链表实现队列快  只有把head的next去掉就可以了
 * 用链表实现队列
 * 
 */


/**
 * 
 * 链表实现队列的注意问题
 * 单向链表 但是要同时记录head和tail
 * 要从tail入队 从head出队 否则出队时tail不好定位
 * length要实时记录  不能遍历链表获取（便利的化 复杂度是O(n)）
 * 
 * 
 * 
 */

type LinkType2 =  {
    value:number,
    next:LinkType2 | null
}

class QueueToList{
    private head:LinkType2 | null = null;
    private tail:LinkType2 | null = null;
    private len = 0
    /**
     * @description 队列添加从tail进行添加
     */
    add(n:number){
        const newNode:LinkType2 = {
            value:n,
            next:null
        }
        let head = this.head
        if(!head){
            this.head = newNode
        }
        let tail = this.tail
        if(tail){
            tail.next = newNode
        }
        this.tail = newNode
        this.len ++
    }

    /**
     * 队列的提取  从head进行提取
     */
    delete(){
        if(!this.head) return null
        if(this.len === 0) return null
        const headNode = this.head
        //取值
        let value = headNode.value;
        //处理长度
        this.len--
        //处理head
        this.head =headNode.next
        return value
    }

    get length(){
        return this.len
    }
}


const link = new QueueToList()
link.add(100)
link.add(200)
link.add(300)

// console.log(link.length)
console.log(link.delete())
console.log(link.delete())
console.log(link.delete())
console.log(link.delete())
